struct ListNode {
  int val;
  ListNode *next;
  ListNode() : val(0), next(nullptr) {}
  ListNode(int x) : val(x), next(nullptr) {}
  ListNode(int x, ListNode *next) : val(x), next(next) {}
};

class Solution {
public:
  ListNode *middleNode(ListNode *head) {
    ListNode *fastPtr = head, *slowPtr = head;
    while (fastPtr != nullptr && fastPtr->next != nullptr) {
      fastPtr = fastPtr->next->next;
      slowPtr = slowPtr->next;
    }
    return slowPtr;
  }
};
